package com.repair.limiter.utils;

import org.redisson.api.RRateLimiter;
import org.redisson.api.RateIntervalUnit;
import org.redisson.api.RateType;
import org.redisson.api.RedissonClient;

import java.time.Duration;

/**
 * @author chunyu
 * @since 2024/9/18,20:38
 */
public class SmsRateLimiter {

    private final RedissonClient redissonClient;

    private static final String LIMITER_KEY_PREFIX = "repair:yixiu:limiter:";

    public SmsRateLimiter(RedissonClient redissonClient) {
        this.redissonClient = redissonClient;
    }

    /**
     * 这里就是通过redisson 获取一个限流的工具
     * 大概就是验证码在1分钟内只能发送一次 类似一个滑动窗口
     * @param key redis存的key
     * @param limit 单位时间允许访问次数
     * @param windowSize 时间60s
     * @return
     */
    public Boolean getRateLimit(String key, int limit, int windowSize) {
        RRateLimiter limiter = redissonClient.getRateLimiter(LIMITER_KEY_PREFIX + key);
        if (!limiter.isExists()) {
            // bug了 这个方法不会设置过期时间 会一直存在
            //limiter.setRate(RateType.OVERALL, limit, windowSize, RateIntervalUnit.SECONDS);
            limiter.trySetRate(RateType.OVERALL, limit, windowSize, RateIntervalUnit.SECONDS);
            limiter.expire(Duration.ofSeconds(windowSize+1));
        }
        return limiter.tryAcquire();
    }
}
